﻿using ToyStore.Domain.Store;
using ToyStore.Domain.System;
using System.Collections.Generic;

namespace ToyStore.Domain.Contracts.Tasks
{
	/// <summary>
	/// Logika biznesowa koszyka z zakupami.
	/// </summary>
	public interface ICartTask
	{
		/// <summary>
		/// Stworzenie nowego koszyka.
		/// </summary>
		/// <returns></returns>
		Cart CreateCart();

		/// <summary>
		/// Stworzenie nowego koszyka.
		/// Po stworzeniu koszyka należy zapamiętać jego Guid w sesji użytkownika.
		/// </summary>
		/// <returns>Koszyk wraz z wygenerowanym Guid'em.</returns>
		Cart CreateCart(User user);

		/// <summary>
		/// Pobranie koszyka po jego numerze Guid (przechowywany on jest w sesji użytkownika).
		/// </summary>
		/// <param name="guid">Guid pobrany z sesji.</param>
		/// <returns>Koszyk użytkownika</returns>
		Cart GetCartByGuid(string guid);

		/// <summary>
		/// Dodanie do koszyka produktu.
		/// </summary>
		/// <param name="cart">Koszyk, do którego dodajemy.</param>
		/// <param name="productId">Numer Id produktu.</param>
		/// <returns>Koszyk z uzupełnionymi danymi.</returns>
		Cart AddProductToCart(Cart cart, int productId);

		/// <summary>
		/// Dodanie do koszyka produktu.
		/// </summary>
		/// <param name="cart">Koszyk, do którego dodajemy.</param>
		/// <param name="product">Produkt do dodania.</param>
		/// <returns>Koszyk z uzupełnionymi danymi.</returns>
		Cart AddProductToCart(Cart cart, Product product);

		/// <summary>
		/// Usunięcie produktu z koszyka.
		/// </summary>
		/// <param name="cart">Koszyk, z którego usuwamy.</param>
		/// <param name="productId">Numer Id produktu do usunięcia.</param>
		/// <returns>Koszyk z uzupełnionymi danymi.</returns>
		Cart RemoveProductFromCart(Cart cart, int productId);

		/// <summary>
		/// Usunięcie produktu z koszyka.
		/// </summary>
		/// <param name="cart">Koszyk, z którego usuwamy.</param>
		/// <param name="product">Produkt do usunięcia.</param>
		/// <returns>Koszyk z uzupełnionymi danymi.</returns>
		Cart RemoveProductFromCart(Cart cart, Product product);

		/// <summary>
		/// Ustawienie ilości produktów w koszyku.
		/// </summary>
		/// <param name="cart">Koszyk.</param>
		/// <param name="productId">Numer Id produktu.</param>
		/// <param name="amount">Ilość do ustawienia.</param>
		/// <returns>Koszyk z uzupełnionymi danymi.</returns>
		Cart SetProductAmountInCart(Cart cart, int productId, int amount);

		/// <summary>
		/// Ustawienie ilości produktów w koszyku.
		/// </summary>
		/// <param name="cart">Koszyk.</param>
		/// <param name="product">Produkt.</param>
		/// <param name="amount">Ilość do ustawienia.</param>
		/// <returns>Koszyk z uzupełnionymi danymi.</returns>
		Cart SetProductAmountInCart(Cart cart, Product product, int amount);

		/// <summary>
		/// Opróżnienie koszyka z wszelkich produktów.
		/// </summary>
		/// <param name="cart">Koszyk.</param>
		/// <returns>Koszyj z uzupełnionymi danymi.</returns>
		Cart EmptyCart(Cart cart);

		/// <summary>
		/// Stworzenie zamówienia na podstawie koszyka.
		/// </summary>
		/// <param name="cart">Koszyk.</param>
		/// <param name="user">Użytkownik, dokonujący zakupu.</param>
		/// <returns>Zamówienie.</returns>
		Order CreateOrder(Cart cart, User user);

		/// <summary>
		/// Odświeżenie danych w koszyku (np. przeliczenie wartości sumarycznej na podstawie aktualnych danych w bazie).
		/// </summary>
		/// <param name="cart">Koszyk.</param>
		/// <returns>Koszyk z odświeżonymi danymi.</returns>
		Cart RefreshCart(Cart cart);
        /// <summary>
        /// Zwraca liste aktualnie wybranych przedmiotów w koszyku
        /// </summary>
        /// <param name="guid"></param>
        /// <returns></returns>
        IList<Product> GetProductsInUserCart(string guid);
	}
}
